﻿// -------------------------------------------------------------------------
//    @FileName         :    NFBagPageGrid.cpp
//    @Author           :    gaoyi
//    @Date             :    2024/12/20
//    @Email            :    445267987@qq.com
//    @Module           :    NFBagPageGrid
//    @Desc             :    单格子逻辑：数量增减、设置与基础属性。
// -------------------------------------------------------------------------

#include "NFBagPageGrid.h"
#include <proto_cs_cmd.nanopb.h>

#include "NFLogicCommon/NFItemDefine.h"
#include "NFComm/NFPluginModule/NFCheck.h"

/**
 * @brief 减少格子物品数量
 * @param iWantDecNum 期望减少数量
 * @param pRealDecNum 输出实际减少数量（可选，为空时必须全部减少）
 * @return 0成功，非0失败
 */
int NFBagPageGrid::DecNumber(int iWantDecNum, int* pRealDecNum)
{
    int iRetCode = 0;
    int iOldNum = GetNumber();
    if (iOldNum < iWantDecNum)
    {
        if (pRealDecNum == nullptr)
        {
            return ERR_CODE_ITEM_NOT_ENOUGH;
        }
        iWantDecNum = iOldNum;
    }

    int iNewNum = iOldNum - iWantDecNum;
    int iRealNum = 0;
    iRetCode = SetNumber(iNewNum, iRealNum);
    CHECK_ERR(0, iRetCode, "SetNumber failed");
    if (iNewNum != iRealNum)
    {
        CHECK_ERR(0, -1, "ullNewNum:{} ullRealNum:{}", iNewNum, iRealNum);
    }

    if (pRealDecNum)
    {
        *pRealDecNum = iWantDecNum;
    }

    return 0;
}

/**
 * @brief 设置格子物品数量（限制在堆叠上限内）
 * @param iNum 要设置的数量
 * @param iRealNum 输出实际设置的数量
 * @return 0成功，非0失败
 */
int NFBagPageGrid::SetNumber(int iNum, int& iRealNum)
{
    if (iNum > 0)
    {
        int iPileNumMax = 0;
        int iRetCode = NFItemUtil::GetItemPileNumMax(GetItemID(), iPileNumMax);
        CHECK_ERR(0, iRetCode, "GetItemPileNumMax failed, itemId:{}", GetItemID());

        iRealNum = iNum > iPileNumMax ? iPileNumMax : iNum;
    }
    else
    {
        iRealNum = iNum;
    }

    m_stItem.SetNumber(iRealNum);

    return 0;
}

/**
 * @brief 设置格子索引（禁止重复设置）
 * @param iGridIndex 格子索引
 * @return 0成功，非0失败
 */
int NFBagPageGrid::SetGridIndex(int iGridIndex)
{
    if (GetGridIndex() != INVALID_ID) // 禁止重复
    {
        CHECK_ERR(0, -1, "GetGridIndex():%d iGridIndex:%d", GetGridIndex(), iGridIndex);
    }
    m_iGridIndex = iGridIndex;
    return 0;
}


